package com.dsbj.mp.icardservice.utils.dateprocess;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * （来自GIPSON-OCS系统）。
 */
public class Lucifer {
	
	/**
	 * 判断是否是对应的格式的日期字符串
	 * 带2个参数  1.时间字符串  2.时间格式
	 * 适用于严谨的时间格式  不能出现2018-7-04 类型
	 *
	 * @param dateStr
	 * @param datePattern
	 * @return
	 * @throws ParseException
	 */
	public static boolean isRightDateStr(String dateStr, String datePattern) {
		DateFormat dateFormat = new SimpleDateFormat(datePattern);
		try {
			//采用严格的解析方式，防止类似 “2017-05-35” 类型的字符串通过
			dateFormat.setLenient(false);
			
			dateFormat.parse(dateStr);
			Date date = (Date) dateFormat.parse(dateStr);
			
			//重复比对一下，防止类似 “2017-5-15” 类型的字符串通过
			String newDateStr = dateFormat.format(date);
			if (dateStr.equals(newDateStr)) {
				return true;
			} else {
				//LOGGER.error("字符串dateStr:{}， 不是严格的 datePattern:{} 格式的字符串");
				return false;
			}
			//为了方便 允许2017-5-15的的字符串出现
			// return true;
		} catch (ParseException e) {
			return false;
		}
	}
	
	/**
	 * 判断是否是对应的格式的日期字符串
	 * 带2个参数  1.时间字符串  2.时间格式
	 * 适用于相对宽松的时间格式  能出现2018-7-04 类型
	 * 返回boolean类型
	 *
	 * @param dateStr
	 * @param datePattern
	 * @return
	 * @throws ParseException
	 */
	public static boolean isValidDate(String str, String datePattern) {
		boolean convertSuccess = true;
		// 指定日期格式为四位年/两位月份/两位日期，注意yyyy/MM/dd区分大小写；
		SimpleDateFormat format = new SimpleDateFormat(datePattern);
		try {
			// 设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期，比如2007/02/29会被接受，并转换成2007/03/01
			format.setLenient(true);
			format.parse(str);
		} catch (ParseException e) {
			// e.printStackTrace();
			// 如果throw java.text.ParseException或者NullPointerException，就说明格式不对
			convertSuccess = false;
		}
		return convertSuccess;
	}
	
	/**
	 * 判断是否是对应的格式的日期字符串
	 * 带2个参数  1.时间字符串  2.时间格式
	 * 适用于相对宽松的时间格式  能出现2018-7-04 类型
	 * 返回String类型
	 *
	 * @param dateStr
	 * @param datePattern
	 * @return
	 * @throws ParseException
	 */
	public static String isValidDateString(String str, String datePattern) {
		String convertSuccess = "";
		// 指定日期格式为四位年/两位月份/两位日期，注意yyyy/MM/dd区分大小写；
		SimpleDateFormat format = new SimpleDateFormat(datePattern);
		try {
			// 设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期，比如2007/02/29会被接受，并转换成2007/03/01
			format.setLenient(false);
			format.parse(str);
			
			Date date = format.parse(str);
			//区分带时分秒  用：号来区分     如果后期有单纯的时分秒  用空格和：来区分
			DateFormat dFormat = null;
			if (str.indexOf(":") != -1 || str.indexOf("时") != -1) {
				dFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
			} else {
				dFormat = new SimpleDateFormat("yyyy-MM-dd");
			}
			convertSuccess = dFormat.format(date);
			
		} catch (ParseException e) {
			// e.printStackTrace();
			// 如果throw java.text.ParseException或者NullPointerException，就说明格式不对
			convertSuccess = "false";
		}
		return convertSuccess;
	}
	
	
	/**
	 * 判断是否是对应的格式的日期字符串  合集 常用字符串
	 * 带1个参数  1.时间字符串
	 * 仅仅供验证  不方便的的就是 有过有其他字符串必须要再次添加  非常不方便
	 * 返回boolean类型
	 *
	 * @param dateStr
	 * @param datePattern
	 * @return
	 * @throws ParseException
	 */
	public static boolean isMatchDate(String str) {
		boolean convertSuccess = true;
		//最常用的 字符串 放在前面  一旦相匹配了  后面的字符串就不用比较了  提高运行效率
		boolean a = isValidDate(str, "yyyy-MM-dd");//yyyy-mm-dd
		if (a == false) {
			boolean b = isValidDate(str, "yyyy/MM/dd");//yyyy/mm/dd
			if (b == false) {
				boolean c = isValidDate(str, "yyyy-MM-dd HH:mm");//yyyy-mm-dd hh:MM
				if (c == false) {
					boolean d = isValidDate(str, "yyyy/MM/dd HH:mm");//yyyy/mm/dd hh:MM
					if (d == false) {
						boolean f = isValidDate(str, "yyyy年MM月dd日");//yyyy年mm月dd日
						if (f == false) {
							boolean g = isValidDate(str, "yyyy年MM月dd日 HH时mm分");//yyyy年mm月dd日 hh分MM秒
							if (g == false) {
								convertSuccess = false;
							}
						}
					}
				}
			}
		}
		return convertSuccess;
	}
	
	/**
	 * 判断是否是对应的格式的日期字符串  合集 常用字符串
	 * 带1个参数  1.时间字符串
	 * 仅仅供验证  不方便的的就是 有过有其他字符串必须要再次添加  非常不方便
	 * 返回boolean类型
	 *
	 * @param dateStr
	 * @param datePattern
	 * @return
	 * @throws ParseException
	 */
	public static String isMatchDateString(String str) {
		String convertSuccess = "";
		//最常用的 字符串 放在前面  一旦相匹配了  后面的字符串就不用比较了  提高运行效率
		String a = isValidDateString(str, "yyyy-MM-dd HH:mm");//yyyy-mm-dd
		if (a.equals("false")) {
			String b = isValidDateString(str, "yyyy/MM/dd HH:mm");//yyyy/mm/dd
			if (b.equals("false")) {
				String c = isValidDateString(str, "yyyy-MM-dd");//yyyy-mm-dd hh:MM
				if (c.equals("false")) {
					String d = isValidDateString(str, "yyyy/MM/dd");//yyyy/mm/dd hh:MM
					if (d.equals("false")) {
						String f = isValidDateString(str, "yyyy年MM月dd日 HH时mm分");//yyyy年mm月dd日
						if (f.equals("false")) {
							String g = isValidDateString(str, "yyyy年MM月dd日");//yyyy年mm月dd日 hh分MM秒
							if (g.equals("false")) {
								convertSuccess = "false";
							} else {
								convertSuccess = g;
							}
						} else {
							convertSuccess = f;
						}
					} else {
						convertSuccess = d;
					}
				} else {
					convertSuccess = c;
				}
			} else {
				convertSuccess = b;
			}
		} else {
			convertSuccess = a;
		}
		return convertSuccess;
	}
    
    
    
    /*public static void main(String[] args) throws ParseException   {
    	//System.out.println(isRightDateStr("2018-04-30","yyyy-mm-dd"));
    	//System.out.println(isValidDate("9时02分01秒","h时mm分ss秒"));
    	
    	*//*System.out.println(isMatchDate("2018年2月28日 8"));
		
    	System.out.println(isValidDate("2018-2-28 25:00","yyyy-MM-dd hh:mm"));
    	
    	System.out.println(isMatchDate("2018-2-28 8"));*//*
	 
	 *//*System.out.println(isValidDateString("2018/2/28 09:00","yyyy/MM/dd hh:mm"));
    	
    	System.out.println(isValidDate("2018/2/28 09:00","yyyy/MM/dd hh:mm"));
    	
    	System.out.println(isValidDateString("2018/2/28","yyyy/MM/dd"));
    	
    	System.out.println(isValidDate("2018/2/28","yyyy/MM/dd"));
    	
    	System.out.println(isValidDateString("2018年2月28日","yyyy年MM月dd日"));
    	
    	System.out.println(isValidDate("2018年2月28日","yyyy年MM月dd日"));*//*
    	
    	//System.out.println(isValidDateString("2018/05/28 17:15","yyyy/MM/dd HH:mm"));
    	//System.out.println(isValidDateString("2018/05/28 5:15","yyyy/MM/dd HH:mm"));
    	//System.out.println(isValidDate("2018年2月28日 9时02分","yyyy年MM月dd日 hh:mm"));

    	//System.out.println(isMatchDateString("2018年2月28日 09时02分"));
    	System.out.println(isMatchDateString("2018/05/28 17:15"));
	}*/
	
	
}
